#include "esfera.hpp"
Esfera::Esfera(Material* _material,const Vetor& _centro = Vetor(0.0,0.0,0.0),const double _raio = 0.5) : centro(_centro) , raio(_raio)
{
	material = _material; /* Material e uma propriedade do Objeto */
}

Esfera::~Esfera(void) { }

Vetor Esfera::getCentro(void) const { return centro; }

double Esfera::getRaio(void) const { return raio; }

Vetor Esfera::getNormal(const Vetor& ponto) const { return ponto.subVet(centro).normaliza(); }

void Esfera::setCentro(Vetor _centro) { centro = _centro; }

void Esfera::setRaio(double _raio) { raio = _raio; }

double Esfera::intersecao(const Raio& r,Vetor& p) {
	/* Função Quadrática Ax² + Bx + C = 0 */
	double delta,distancia=90.0;
	//const double a = 1.0;
	const double a = r.getDirecao().prodEsc(r.getDirecao());
	const double b = 2.0*(r.getDirecao().prodEsc(r.getOrigem()) - r.getDirecao().prodEsc(centro));
	const double c = abs(r.getOrigem().prodEsc(r.getOrigem()) - 2.0f*r.getOrigem().prodEsc(centro) + centro.prodEsc(centro)) - raio*raio;
	delta = b*b - 4.0*a*c;
	if (delta >=0.0) {
		double raiz1 = (-b + sqrt(delta))/2.0*a;
		double raiz2 = (-b - sqrt(delta))/2.0*a;
		if(raiz1 < 0.0) raiz1 = 90.0;
		if(raiz2 < 0.0) raiz2 = 90.0;
		distancia = min(raiz1,raiz2);
		if(distancia >= 0.0 && distancia <=5.0) {
			p.set(
					r.getOrigem().x + distancia*r.getDirecao().x,
					r.getOrigem().y + distancia*r.getDirecao().y,
					r.getOrigem().z + distancia*r.getDirecao().z
				);
			
		}
	}
	return distancia;
	
}
